package modelo.Trayectoria;

import modelo.Orientacion.*;
import java.util.ArrayList;

public class CreadorDeDirecciones {

    public CreadorDeDirecciones(){
    }

    public boolean existeAlgunaDireccionEnElEjeX(Posicion inicio, Posicion fin){
    /*PreCondicion: el creador debe haberse creado con el constructor
      PostCondicion: devuelve true si se puede llegar desde el inicio hasta el
      fin con alguna direccion en el eje X*/
        Direccion dir1 = new Derecha();
        Direccion dir2 = new Izquierda();
        return (dir1.seLlegaConEstaDireccion(inicio, fin) || dir2.seLlegaConEstaDireccion(inicio, fin));
    }

    public boolean existeAlgunaDireccionEnElEjeY(Posicion inicio, Posicion fin){
    /*PreCondicion: el creador debe haberse creado con el constructor
      PostCondicion: devuelve true si se puede llegar desde el inicio hasta el
      fin con alguna direccion en el eje Y*/
        Direccion dir1 = new Arriba();
        Direccion dir2 = new Abajo();
        return (dir1.seLlegaConEstaDireccion(inicio, fin) || dir2.seLlegaConEstaDireccion(inicio, fin));
    }

    public boolean existeDirecionesCombinadas(Posicion inicial, Posicion fin){
    /*PreCondicion: el creador debe haberse creado con el constructor
      PostCondicion: devuelve true si se puede llegar desde el inicio hasta el
      fin con alguna diagonal*/
        boolean existeDirEnElEjeX = this.existeAlgunaDireccionEnElEjeX(inicial, fin);
        boolean existeDirEnElEjeY = this.existeAlgunaDireccionEnElEjeY(inicial, fin);
        if (existeDirEnElEjeX && existeDirEnElEjeY) return true;
        return false;
    }

    public Direccion devolverDireccionDelEjeX(Posicion inicio, Posicion fin){
    /*PreCondicion: el creador debe haberse creado con el constructor y debe existir
      alguna direccion en el eje X que se pueda llegar desde el inicio hasta el fin
      PostCondicion: devuelve la direccion que se puede llegar desde el inicio
      hasta el fin en el eje X*/
        Direccion dir1 = new Derecha();
        Direccion dir2 = new Izquierda();
        if (dir1.seLlegaConEstaDireccion(inicio, fin)) return dir1;
        return dir2;
    }

    public Direccion devolverDireccionDelEjeY(Posicion inicio, Posicion fin){
    /*PreCondicion: el creador debe haberse creado con el constructor y debe existir
      alguna direccion en el eje X que se pueda llegar desde el inicio hasta el fin
      PostCondicion: devuelve la direccion que se puede llegar desde el inicio
      hasta el fin en el eje Y*/
        Direccion dir1 = new Arriba();
        Direccion dir2 = new Abajo();
        if (dir1.seLlegaConEstaDireccion(inicio, fin)) return dir1;
        return dir2;
    }

    public Direccion devolverDireccionCombinada(Posicion inicial, Posicion fin){
    /*PreCondicion: el creador debe haberse creado con el constructor y debe existir
      alguna direccion combinada que se pueda llegar desde el inicio hasta el fin
      PostCondicion: devuelve la direccion que se puede llegar desde el inicio
      hasta el fin con alguna direccion combinada*/
        Direccion dir1 = this.devolverDireccionDelEjeX(inicial, fin);
        Direccion dir2 = this.devolverDireccionDelEjeY(inicial, fin);
        Direccion dir;
        ArrayList<Direccion> direcciones = new ArrayList<Direccion>();
        direcciones.add(dir1);
        direcciones.add(dir2);
        dir = new DireccionCombinada(direcciones);
        return dir;
    }

}
